package com.szh.zx.javacorecorret.chap2.one;

import java.util.concurrent.CountDownLatch;
// 本实验想要实现裁判员等待所有运动员都就位然后开始比赛的效果
// todo 下面的代码是有缺陷
// 有可能准备的时间超过2秒。这时，调用 service.downMethod()方法达不到-唤醒所有线程-继续向下运行的目的了，也就是说，裁判员没有等到所有运动员就开始比赛了。
public class CountDownLatchTest3 {
	public static void main(String[] args) throws InterruptedException {
		MyService3 myService = new MyService3();
		MyThread3[] tArray = new MyThread3[10];

		for (int i = 0; i < tArray.length; i++) {
			tArray[i]=new MyThread3(myService);
			tArray[i].setName("线程"+(i+1));
			tArray[i].start();
		}
		Thread.sleep(2000);
		myService.downMethod();
	}
}
class MyService3{
	private CountDownLatch down = new CountDownLatch(1);

	public void testMethod(){
		try {
			System.out.println(Thread.currentThread().getName()+"准备");
			// 阻塞到 计数为零
			down.await();
			System.out.println(Thread.currentThread().getName()+"结束");

		}catch (InterruptedException e){
			e.printStackTrace();
		}
	}
	public void downMethod(){
		System.out.println("开始");
		down.countDown();
	}
}

class MyThread3 extends Thread{
	private MyService3 myService3;

	public MyThread3(MyService3 myService3) {
		this.myService3 = myService3;
	}

	@Override
	public void run() {
		myService3.testMethod();
	}
}